﻿#include "xaudio.h"

namespace HeaderMedia {

void XAudio::stop() {
  std::lock_guard<std::mutex> _(xMtx);
  if (xAudioOutput) {
    xAudioOutput->stop();
    delete xAudioOutput;
    xAudioOutput = nullptr;
    xIO = nullptr;
  }
}

void XAudio::start() {
  stop();
  std::lock_guard<std::mutex> _(xMtx);
  // Qt 音频格式
  QAudioFormat fmt;
  // 1 秒采集 48000 个声音
  fmt.setSampleRate(xSampleRate);
  // 16 位
  fmt.setSampleSize(xSampleSize);
  // 双声道
  fmt.setChannelCount(xChannel);
  // 编码格式
  fmt.setCodec("audio/pcm");
  // 次序
  fmt.setByteOrder(QAudioFormat::LittleEndian);
  // 样本的类别
  fmt.setSampleType(QAudioFormat::UnSignedInt);

  xAudioOutput = new QAudioOutput(fmt);
  xIO = xAudioOutput->start();
}

void XAudio::volume(qreal value) {
  if (xAudioOutput) {
    xAudioOutput->setVolume(value);
  }
}

void XAudio::play(bool isPlayed) {
  std::lock_guard<std::mutex> _(xMtx);
  if (xAudioOutput) {
    return;
  }
  if (isPlayed) {
    xAudioOutput->resume();
  } else {
    xAudioOutput->suspend();
  }
}

bool XAudio::write(const char *data, int dataSize) {
  if (!data || dataSize <= 0) {
    return false;
  }

  std::lock_guard<std::mutex> _(xMtx);
  if (xIO) {
    // 输入输出设备播放声音，将数据从零
    // 终止的 8 位字符字符串写入设备
    xIO->write(data, dataSize);
    return true;
  }

  return false;
}

int XAudio::getFree() {
  std::lock_guard<std::mutex> _(xMtx);
  if (!xAudioOutput) {
    return 0;
  }
  int free = xAudioOutput->bytesFree();

  return free;
}

} // namespace HeaderMedia











